﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIIV.Data;
using SIIV.Business.Exceptions;

namespace SIIV.Business
{
    public enum Roles
    {
        Administrador = 1, Laboratorio, Veterinario, Administrativo
    }

    public class UsuarioBusiness
    {
        public Usuario ObtenerUsuario(int idUsuario)
        {
            using (SIIVDataModel model = new SIIVDataModel())
            {
                Usuario usuario = model.Usuarios.Include("Rol").SingleOrDefault(u => u.IdUsuario.Equals(idUsuario) && u.Activo);
                if (usuario != null)
                {
                    return usuario;
                }
                else
                {
                    throw new FunctionalException("Usuario inexistente.");
                }
            }
        }

        public Usuario ObtenerUsuario(string nombreUsuario, string contraseña)
        {
            using (SIIVDataModel model = new SIIVDataModel())
            {
                Usuario usuario = model.Usuarios.Include("Rol").SingleOrDefault(u => u.Username.Equals(nombreUsuario) && u.Password.Equals(contraseña) && u.Activo);
                if (usuario != null)
                {
                    return usuario;
                }
                else
                {
                    throw new FunctionalException("Usuario inexistente.");
                }
            }
        }

        public List<Usuario> ObtenerUsuarios(string username, string nombreApellido, string email, long? nroDocumento, Roles? rol)
        {
            using (SIIVDataModel model = new SIIVDataModel())
            {
                short sRol = rol.HasValue ? (short)rol.Value : default(short);
                return model.Usuarios.Include("Rol").Where(u =>
                    u.Activo &&
                    (username.Equals(string.Empty) ? true : u.Username.Contains(username)) &&
                    (nombreApellido.Equals(string.Empty) ? true : u.Nombre.Contains(nombreApellido) || u.Apellido.Contains(nombreApellido)) &&
                    (email.Equals(string.Empty) ? true : u.Email.Contains(email)) &&
                    (nroDocumento.HasValue ? u.NroDocumento.Equals(nroDocumento.Value) : true) &&
                    (sRol.Equals(default(short)) ? true: u.Rol.IdRol.Equals(sRol))).ToList();
                    
            }
        }

        public List<Usuario> ObtenerUsuarios(Roles rol)
        {
            using (SIIVDataModel model = new SIIVDataModel())
            {
                return model.Usuarios.Include("Rol").Where(u => u.Activo && u.IdRol.Equals((short)rol)).ToList();
            }
        }

        public List<Rol> ObtenerRoles()
        {
            using (SIIVDataModel model = new SIIVDataModel())
            {
                return model.Rols.ToList();
            }
        }

        public void CrearUsuario(string apellido, string contraseña, string email, string nombre, long numeroDocumento, string username, DateTime fechaNacimiento, Roles rol)
        {
            using (SIIVDataModel model = new SIIVDataModel())
            {
                if (!model.Usuarios.Any(u => u.Username == username))
                {
                    model.AddToUsuarios(new Usuario()
                    {
                        Activo = true,
                        Apellido = apellido,
                        Email = email,
                        FechaNacimiento = fechaNacimiento,
                        IdRol = (short)rol,
                        Nombre = nombre,
                        NroDocumento = numeroDocumento,
                        Password = contraseña,
                        Username = username
                    });
                    model.SaveChanges();
                }
                else
                {
                    throw new FunctionalException("El Usuario ya existe en la base de datos.");
                }
            }
        }

        public void ActualizarUsuario(int idUsuario, string apellido, string contraseña, string email, string nombre, long numeroDocumento, string username, DateTime fechaNacimiento, Roles rol)
        {
            using (SIIVDataModel model = new SIIVDataModel())
            {
                    Usuario usuario = model.Usuarios.Single(u => u.IdUsuario.Equals(idUsuario));
                    if (usuario.Apellido == apellido && usuario.Email == email && usuario.FechaNacimiento == fechaNacimiento && usuario.IdRol == (short)rol
                        && usuario.Nombre == nombre && usuario.NroDocumento == numeroDocumento && usuario.Password == contraseña && usuario.Username == username)
                    {
                        throw new FunctionalException("Debe Modificar algún dato del usuario");
                    }
                    else
                    {
                        if (usuario.Username == username)
                        {
                            usuario.Apellido = apellido;
                            usuario.Email = email;
                            usuario.FechaNacimiento = fechaNacimiento;
                            usuario.IdRol = (short)rol;
                            usuario.Nombre = nombre;
                            usuario.NroDocumento = numeroDocumento;
                            usuario.Password = contraseña;
                            model.SaveChanges();
                        }
                        else
                        {
                            if (!model.Usuarios.Any(u => u.Username == username))
                            {
                                usuario.Apellido = apellido;
                                usuario.Email = email;
                                usuario.FechaNacimiento = fechaNacimiento;
                                usuario.IdRol = (short)rol;
                                usuario.Nombre = nombre;
                                usuario.NroDocumento = numeroDocumento;
                                usuario.Password = contraseña;
                                usuario.Username = username;
                                model.SaveChanges();
                            }
                            else
                            {
                                throw new FunctionalException("El Usuario ya existe en la base de datos.");
                            }
                        }
                    }
            }
        }

        public void EliminarUsuario(int idUsuario)
        {
            using (SIIVDataModel model = new SIIVDataModel())
            {
                Usuario usuario = model.Usuarios.Single(u => u.IdUsuario.Equals(idUsuario));
                usuario.Activo = false;
                model.SaveChanges();
            }
        }

        public Usuario VerificarExisteUsuario(string nombreUsuario)
        {
            using (SIIVDataModel model = new SIIVDataModel())
            {
                Usuario usuario = model.Usuarios.SingleOrDefault(u => u.Username.Equals(nombreUsuario));
                
                if (usuario != null)
                {
                    return usuario;
                }
                else
                {
                    return usuario;
                   throw new FunctionalException("    Usuario existente");
                }
            }
        }

        public Usuario VerificarModUsuario(int idUsuario, string nombreUsuario)
        {
            using (SIIVDataModel model = new SIIVDataModel())
            {
                Usuario usuario = model.Usuarios.Include("Rol").SingleOrDefault(u => u.Username.Equals(nombreUsuario) && !u.IdUsuario.Equals(idUsuario) && u.Activo);
                if (usuario == null)
                {
                    return usuario;
                }
                else
                {
                    throw new FunctionalException("    El usuario ya existe");
                }
            }
        }
    }
}
